/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Declaracoes;

import analiseSintatica.Regras.*;
import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Expressoes.RegraExpressao;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class RegraAtribuicaoVar extends Regra{


    protected static Regra instancia;
    protected static String estrutura = "= <expressao>";


    /**
     * Construtor privado necessario ao singleton
     */
    private RegraAtribuicaoVar(){

    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraAtribuicaoVar getInstance() {
        if (instancia == null) {
            instancia = new RegraAtribuicaoVar();
        }
        return (RegraAtribuicaoVar) instancia;

    }

    

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {

        ErroSintaticoException erros = new ErroSintaticoException();

        NoArvore naoterminalAtribuicaoVar = new NoArvore("<AtribuicaoVar>", false);

        naoterminalAtribuicaoVar.adicionaFilho(reconheceToken(listaTokens, "=",estrutura));

        try{

            naoterminalAtribuicaoVar.adicionaFilho(RegraExpressao.getInstance().analisar(listaTokens));

            }
            catch(ErroSintaticoException e){

                while(e.size() != 0)
				erros.addErros(e.getErros());

            }

        return naoterminalAtribuicaoVar;
    }

    @Override
    protected void setPrimeiro() {
        primeiro.add("=");
    }

    @Override
    protected void setSeguinte() {
        seguinte = RegraDeclaracaoVar.getInstance().getSeguinte();
    }

    
}
